In the early days of computing, computer systems were standalone processors to which peripheral devices such as displays and printers and input devices were connected. Each computer system was independent and communicated little with other computer systems. Today, however, it is well known that interconnecting computer systems in computer networks, such as local area networks or wide area networks, greatly enhances the sharing of data, services and resources available from the various computer systems that are part of the network.
To communicate between the different computer systems along a network, many communication protocols have been developed. Some examples of well-known network protocols include the System Network Architecture (SNA), Transmission Control Protocol/Internet Protocol (TCP/IP), Network Basic Input Output System (NetBIOS), and Internet Packet Exchange/Sequence Packet Exchange (IPX/SPX). Those skilled in the art are familiar with each of these protocols, as well as others.
Conventional network interface cards (NICs) sold today consist of a host interface, media access layer logic and a physical interface. The goal in NIC design is to transport network packets to and from a resident host as expeditiously as possible, which usually means minimizing the hardware through which the packet stream is forced to travel. Host resident software, consisting of a network driver, a transport stack (which may be TCP/IP) and a socket layer interface, processes the packet stream or streams into buffer layer transfers that are presented to applications through a relatively uniform application program interface (“API”). In a Unix/Linux environment, the API is usually referred to as a “socket.” In a Windows® NT/2000 environment, the API is embodied as “Winsock 2.” Other interface layers, such as the TDI interface layer for kernel access within Windows NT, are possible. It should be noted, however, that all of these interface points occur at the top of the transport stack.
Currently, devices within a computer system wishing to communicate with the network do so at the socket layer. For example, if a Redundant Array of Independent Disks (RAID) controller is present within the system, network file system requests result in activity within the host to service those requests. Disk I/O blocks that are read from the RAID controller are first transferred to the computer system's main memory, and, from there, through an API to the transport stack. In the transport stack, the blocks are encapsulated within the selected protocol and transferred to the NIC for transmission as one or more IP packets.
As mentioned above, it is important to note that all of these interface points occur at the top of the transport stack. Therefore, it should be apparent from the above discussion that all data travels twice across the system's I/O bus, and that this wasteful data movement therefore becomes a major bottleneck for network throughput.
To accelerate data transfer rates, prior art solutions called for the transport stack to be moved to the level of a mezzanine bus within the computer system. This required the use of co-processors located on the NIC itself (commonly known as “intelligent processors”) to run the TCP/IP stack. Unfortunately, intelligent processors proved expensive and sometimes actually decreased network throughput.
Accordingly, what is needed in the art is a way to increase network throughput reliably, without substantially increasing the cost of the computer system as a whole.